package com.lqr.wechat.factory;

import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.support.annotation.NonNull;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;

/**
 * @创建者 林洽锐
 * @创建时间 2016/8/19 0019
 * @描述 popupwindow工厂
 */
public class PopupWindowFactory {

    /**
     * 得到在屏幕中间的popupwindow并显示（宽高都是包裹视图）
     *
     * @param contentView popupwindow要显示的视图
     * @param parentView  参考视图
     * @return
     */
    public static PopupWindow getPopupWindowInCenter(View contentView, View parentView) {
        //        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int width = ViewGroup.LayoutParams.WRAP_CONTENT;
        int height = ViewGroup.LayoutParams.WRAP_CONTENT;

        return getPopupWindowInCenter(contentView, width, height, parentView);
    }

    /**
     * 得到在屏幕中间的popupwindow并显示
     *
     * @param contentView popupwindow要显示的视图
     * @param width       popupwindow的宽度
     * @param height      popupwindow的高度
     * @param parentView  参考视图
     * @return
     */
    public static PopupWindow getPopupWindowInCenter(View contentView, int width, int height, View parentView) {
        //Gravity.CENTER:在屏幕居中，无偏移
        return getPopupWindowAtLocation(contentView, width, height, parentView, Gravity.CENTER, 0, 0);
    }

    /**
     * 得到指定在某个视图内位置的popupwindow并显示
     *
     * @param contentView popupwindow要显示的视图
     * @param width       popupwindow的宽度
     * @param height      popupwindow的高度
     * @param parentView  参考视图
     * @param gravityType 在参考视图中的相对位置
     * @param xoff        x轴偏移量
     * @param yoff        y轴偏移量
     * @return
     */
    public static PopupWindow getPopupWindowAtLocation(View contentView, int width, int height, View parentView, int gravityType, int xoff, int yoff) {
        PopupWindow popupWindow = getPopupWindow(contentView, width, height);

        //在parentView中偏移xoff和yoff
        popupWindow.showAtLocation(parentView,
                gravityType, xoff, yoff);

        return popupWindow;
    }

    public static PopupWindow getPopupWindowAtLocation(View contentView, View parentView, int gravityType, int xoff, int yoff) {
        return getPopupWindowAtLocation(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, parentView, gravityType, xoff, yoff);
    }


    /**
     * 得到一个自动识别在目标控件上方或下方的pupupwindow并显示
     *
     * @param contentView popupwindow要显示的视图
     * @param width       popupwindow的宽度
     * @param activity    能得到getWindowManager()的上下文
     * @return
     */
    public static PopupWindow getPopupWindowAsDropDownParentAuto(View contentView, int width, int height, View anchorView, Activity activity) {

        //        View itemView = (View) contentView.getParent();// 得到contentView的父控件
        PopupWindow popupWindow = getPopupWindow(contentView, width, height);

        // 控制它放置的位置
        if (isShowBottom(activity, anchorView)) {// 显示popupwindow在itemView的下方，偏移量都为0
            popupWindow.showAsDropDown(anchorView, 0, 0);
        } else {// 显示popupwindow在itemView的上方，偏移量y都为-2*itemView.getHeight()
            popupWindow.showAsDropDown(anchorView, 0,
                    -2 * anchorView.getHeight());
        }

        return popupWindow;
    }


    /**
     * 得到在指定某个视图外的popupwindow并显示
     *
     * @param contentView popupwindow要显示的视图
     * @param width       popupwindow的宽度
     * @param height      popupwindow的高度
     * @param anchorView  参考视图
     * @param xoff        x轴偏移量
     * @param yoff        y轴偏移量
     * @return
     */
    public static PopupWindow getPopupWindowAsDropDown(View contentView, int width, int height, View anchorView, int xoff, int yoff) {
        PopupWindow popupWindow = getPopupWindow(contentView, width, height);
        popupWindow.showAsDropDown(anchorView, xoff, yoff);
        return popupWindow;
    }

    /**
     * 得到在指定某个视图外的popupwindow并显示(该方法只支持4.4以上)
     *
     * @param contentView popupwindow要显示的视图
     * @param width       popupwindow的宽度
     * @param height      popupwindow的高度
     * @param anchorView  参考视图
     * @param gravityType 在参考视图外的相对位置
     * @param xoff        x轴偏移量
     * @param yoff        y轴偏移量
     * @return
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static PopupWindow getPopupWindowAsDropDown(View contentView, int width, int height, View anchorView, int gravityType, int xoff, int yoff) {
        PopupWindow popupWindow = getPopupWindow(contentView, width, height);
        popupWindow.showAsDropDown(anchorView, xoff, yoff, gravityType);
        return popupWindow;
    }


    /**
     * 判断popupWindow是否显示在条目的下方
     *
     * @param itemView
     * @return
     */
    private static boolean isShowBottom(Activity context, View itemView) {
        // 得到屏幕的高度
        // int heightPixels =
        // getResources().getDisplayMetrics().heightPixels;//方式1
        int screenHeight = context.getWindowManager().getDefaultDisplay().getHeight();// 方式2

        int[] location = new int[2];
        // location[0]-->x
        // location[1]-->y
        itemView.getLocationInWindow(location);
        // 得到itemView在屏幕中Y轴的值
        int itemViewY = location[1];

        // 得到itemView距离屏幕底部的距离
        int distance = screenHeight - itemViewY - itemView.getHeight();

        if (distance < itemView.getHeight()) {// 条目下方放不下popupWindow
            return false;
        } else {// 条目下方放得下popupWindow
            return true;
        }
    }

    /**
     * 最核心的pupupwindow创建方法
     *
     * @param contentView popupwindow要显示的视图
     * @param width       popupwindow的宽度
     * @param height      popupwindow的高度
     * @return
     */
    @NonNull
    private static PopupWindow getPopupWindow(View contentView, int width, int height) {
        PopupWindow popupWindow = new PopupWindow(contentView, width, height, true);
        popupWindow.setOutsideTouchable(false);
        openOutsideTouchable(popupWindow);
        return popupWindow;
    }

    /**
     * 点击popupwindow范围以外的地方时隐藏
     *
     * @param popupWindow
     */
    public static void openOutsideTouchable(PopupWindow popupWindow) {
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        popupWindow.setOutsideTouchable(true);
    }

    /**
     * 使window变暗
     */
    public static void makeWindowDark(Activity activity) {
        makeWindowDark(activity, 0.7f);
    }

    public static void makeWindowDark(Activity activity, float alpha) {
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.alpha = alpha;
        activity.getWindow().setAttributes(lp);
    }

    /**
     * 使window变亮
     */
    public static void makeWindowLight(Activity activity) {
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.alpha = 1f;
        activity.getWindow().setAttributes(lp);
    }


}
